分享wifidog的增强版: wifidogx

您所在的位置:网站首页 miui 12 bugreport 分享wifidog的增强版: wifidogx

分享wifidog的增强版: wifidogx

#分享wifidog的增强版: wifidogx| 来源: 网络整理| 查看: 265

j同学前阵子有段时间在维护wifidog,然后就重复发明了个轮子:wifidogx。当然也不能算完全重复,j同学认为以下几方面wifidog做的不是很好:

多线程的架构欠佳,性能不强,健壮性也不好,坑还多。(LOCK_CLIENT_LIST,LOCK_CLIENT_LIST,LOCK_CLIENT_LIST,讨厌的事情也说三遍)。通信协议过于简单,与服务端交互效率不高,服务端的远程控制能力也不好。在已认证用户比较多的时候,对mac地址进行逐一规则匹配会降低路由器的包处理能力。不过j同学目前还没有实验数据。不支持https。c语言开发效率低。虽然比j同学更懒的人不多,但是反复枯燥的交叉编译-远程复制-opkg install,即便是勤奋的你也会厌烦的。

wifidogx差不多克服了上面所有的缺点,来掰一掰吧:

单线程架构,采用epoll来支持并发。采用新的认证通信协议。提供以ipset的方式进行防火墙规则管理(需要6.22及以上版本,并且j同学目前还不知道怎么做流量统计)。与认证服务器的通信支持https。全部用lua开发。以及一个小小的bonus: 支持简单的静态文件服务。 wifidogx目前处于alpha版本,可能bug还比较多,但是j同学会一直维护。另外,wifidogx采用MIT许可证。 下载,编译,运行wifidogx依赖于j同学开发的一个基于lua的工具包[lask](https://github.com/spyderj-cn/lask)。lask导出了常用的posix api,并提供了一个异步通信框架。下载git clone https://github.com/spyderj-cn/wifidogx.git编译Wifidogx中(只)包含了支持openwrt的makefile文件,将源码包放在某个src-link的的目录下即可。同wifidog一样,wifidogx也在menuconfig的/Network/Captive Portals栏目下。

本质上wifidogx不需要编译,其编译实际上是安装过程。

运行启动 /etc/init.d/wifidogx start停止 /etc/init.d/wifidogx stop

目前不支持restart哦

Wifidogx详细的启动参数 选项 含义 -a 认证路径,会覆盖配置文件中的AuthURL -c 配置文件路径,默认为/etc/wifidogx.conf -f 不要以守护进程的方式运行 -p 日志路径 -l 日志等级 -t 测试配置文件是否正确 -I 初始化防火墙规则后退出 -D 销毁防火墙规则后退出 -h 帮助信息 -v 显示版本wdxctl(对应wdctl)工具 命令 作用 clients 获取连接了wifi的用户信息 jclients 获取连接了wifi的用户信息(json输出) logread 当日志保存在wifidogx内存中时,读取日志 logcapture 截获日志 start wifidogx异常退出后,会将traceback和日志分别保存到/tmp/wifidogx.traceback和/tmp/wifidogx.logdump,然后执行wdxctl start。wdxctl start先尝试将错误信息文件POST到指定的bugreport_url,然后删除文件,接着执行/etc/init.d/wifidogx start。

可以修改wdxctl.lua的BUGREPORT_URL为你的服务器URL, 也可以设置为false或者nil来禁用此功能。

文件服务wifidogx启动后检查/tmp/wifidogx-www是否存在,如果不存在则将/etc/wifidogx-www下的所有内容复制到/tmp/wifidogx-www,并以/tmp/wifidogx-www为docroot开启文件服务。如果来访的URL是“/wifidogx-static/*”格式则视其为请求静态文件。当错误发生时,wifidogx自动回送/tmp/wifidogx-www目录下的以下文件 文件名 错误原因 netdown.htm 外网不通 serverunreach.htm 有外网但认证服务器连不上 servererror.htm 服务器返回的数据不对 internalerror.htm 路由器系统/wifidogx 内部错误,如arp表中根据来访的ip找不到mac在后续和服务器的通信中,如果服务器的应答配置了StaticGZ, 则wifidogx根据StaticGZ指定的URL下载该压缩包,并将压缩包的内容解压到/tmp/wifidogx-www中。

一些典型的StaticGZ用法:

替换wifidogx的错误提示页面。 缓存login等页面上的图片。 指定RedirectHostname为GatewayAddress,完全进行本地推送认证页面。 配置文件配置文件中的选项,大部分都可以由认证服务器动态修改,除了以下几项:AuthURL GatewayID (可选)GatewayPort (可选)GatewayAddress GatewayInterfaceExternalInterface (可选)Firewall Rules (这一项也应当被动态修改,但是j同学还没想好具体做法)一些改动

不再支持AuthServer块和多个认证服务器,只支持单个AuthURL。

(如有特殊字符请先编码,wifidogx不自动进行url编码。) 示例: AuthURL https://mysite.com:8888/index.php?s=/Wifidogx/auth

重定向服务器可以和认证服务器不同,由RedirectHostname指定。

RedirectPort指定跳转端口,默认为80。 几个跳转路径分别由PortalPath/MessagePath/LoginPath指定。 (PortalPath/MessagePath/LoginPath尾部的&(或?)是必要的;并且如有特殊字符请先编码)。 示例: RedirectHostname www.mysite2.com PortalPath /index.php?s=/Wifidogx/portal MessagePath /index.php?s=/Wifidogx/message LoginPath /index.php?s=/Wifidogx/login

ClientTimeout的意义改为认证后能上网的时间(秒)。

示例: ClientTimeout 7200

添加PingInterval字段,意义是和服务器的心跳间隔(秒)。

示例: PingInterval 30

配置文件中的黑白MAC名单将被忽略。

通信协议技术特点

通信过程是wifidogx和wifidog区别最大的一块,j同学认为wifidogx的通信技术需求应当有以下几方面:

能进行批量认证,数据采用json编码,使用post方法发送http请求。数据量比较大的时候使用gzip压缩。最多只和认证服务器建一条tcp连接,所有认证都通过这条连接进行。报文的发送间隔和远程控制的延时成正比。因此心跳间隔不适合太大,并且双方的http报文应启用keep-alive。

请在http应答中指定Content-Length为实际长度,或者启用Chunked的传输编码,wifidogx无法自动探测消息体的结束。 请求报文示例{ "id": "11:11:11:11:11:11" "version": "1.0.0", "clients": [ { "mac" : "11:11:11:11:11:12" "ip" : "192.168.1.123", "token" : "whateverthetokenis", "state" : "authed", "incoming" : 1111, "outgoing" : 2222, "starttime" : 1234, }, { "mac" : "11:11:11:11:11:13" ... }, ... ], "uptime": 333, "seq": 20, "sys_uptime" : 123132, "status": { "sys_memfree":9284, "sys_load":"0.03" }, }字段意义详解

*表示必需的,非必需项的属性名可以不存在,也可能其值为false或者{}

字段名 说明 id* 即GatewayID,若无指定则是GatewayInterface的mac地址 version* wifidogx版本号 uptime* wifidogx启动后经过的秒数 sys_uptime* 系统启动后经过的秒数(即/proc/uptime) seq* 报文序号,每成功完成一次http交互后加一,初始为0 clients 需要认证处理的用户信息 status 当前系统状态

clients为用户信息数组,每个元素的各字段意义是:

字段名 说明 mac 用户mac ip 用户使用的ip token token state 当前状态 starttime 进入此状态的时间戳(自系统启动),即sys_uptime - starttime为状态已持续时间 outgoing 发送的流量 incoming 接收的流量

几种状态:

状态名称 解释 login 用户还未认证,防火墙规则未放行 authed 已认证,已放行 logout 认证期已过,规则已关,通知了认证服务器后此用户信息会被删除应答报文示例{ "config":{ "ClientTimeout":7200, "PingInterval":20, "CheckInterval":300, "StaticGZ":"http://mysite.com/Public/wifidogx.tar.gz", "SetWhiteMaclist":["9c:c1:72:5e:51:49","11:11:11:11:11:12"], "SetBlackMaclist":["11:11:11:11:11:13","11:11:11:11:11:14"], "GreenHostname" : ["www.baidu.com", "1.2.3.4"] }, "clients":[ {"mac":"08:7a:4c:8a:c1:62","auth":1} ]}配置项

当应答中指定了config时,wifidogx将立即接受这样配置并予以生效。 这些是wifidogx新增的配置项:

配置名 解释 StaticGZ 见文件服务部分 SetWhiteMaclist 设置白名单 AddWhiteMaclist 添加白名单 DelWhiteMaclist 删除白名单 SetBlackMaclist 设置黑名单 AddBlackMaclist 添加黑名单 DelBlackMaclist 删除黑名单 GreenHostname 无论是否认证都可直接访问的主机名认证结果

wifidogx不支持wifidog的试用期功能,认证结果只能是1或者0,其他值不合法。

附录服务端开发示例PHP版本(基于ThinkPHP)

wifidogx的AuthURL指定为 http://mysite.com/index.php?s=/Wifidogx/auth

class WifidogxAction extends Action{ public function auth() { $resp = array(); $req = false; $content = file_get_contents('php://input'); if ($content && $_SERVER['CONTENT_ENCODING'] && strpos($_SERVER['CONTENT_ENCODING'], 'gzip') !== false) $content = gzdecode($content); if ($content) $req = json_decode($content); if (!$req || !$req->id) return; if ($req->seq == 0) { $resp['config'] = array( 'ClientTimeout' => 7200, 'PingInterval' => 20, 'CheckInterval' => 300, 'StaticGZ' => 'http://mysite.com/Public/wifidogx.tar.gz', 'SetWhiteMaclist' => array('9c:c1:72:5e:51:49', '11:11:11:11:11:12'), 'SetBlackMaclist' => array('11:11:11:11:11:13', '11:11:11:11:11:14'), 'RedirectHostname' => 'mysite.com', 'LoginPath' => '/index.php?s=/Wifidogx/login&', 'MessagePath' => '/index.php?s=/Wifidogx/message&' 'PortalPath' => '/index.php?s=/Wifidogx/portal&' ); } if ($req->clients) { $clients = array(); foreach ($req->clients as $client) { $clients[] = array( 'mac' => $client->mac, 'auth' => 1, ); } $resp['clients'] = $clients; } $json_resp = json_encode($resp); header('Content-Length: ' . strlen($json_resp)); header('Content-Type: application/json'); echo $json_resp; } public function login() { // ... } public function message() { // ... } public function portal() { // ... }}


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3